package com.scs.application.modules.wm.utils;

import com.google.common.collect.Maps;
import org.springframework.util.NumberUtils;
import java.util.Map;

/**
 * 业务方法数据暂存区
 */
public class ServiceState {

    // ThreadLocal暂存业务数据，初始化Map，默认长度8
    private static final ThreadLocal<Map<String, Object>> state = ThreadLocal.withInitial(() -> Maps.newHashMapWithExpectedSize(8));

    // 验证提示
    public final static String VALID_MSG = "validMsg";

    /** 设置值 */
    public static void set(String key, Object value) {
        state.get().put(key, value);
    }

    /** 设置值，map形式 */
    public static void set(Map<String, Object> valueMap) {
        state.get().putAll(valueMap);
    }

    /** 获取值 */
    public static Object get(String key) {
        return state.get().get(key);
    }

    /** 获取值并指定默认值 */
    public static Object get(String key, Object defaultValue) {
        return state.get().get(key) == null ? defaultValue : String.valueOf(state.get().get(key));
    }

    /** 获取字符串类型的值 */
    public static String getString(String key) {
        return state.get().get(key) == null ? null : String.valueOf(state.get().get(key));
    }

    /** 获取字符串类型的值并指定默认值 */
    public static String getString(String key, String defaultValue) {
        return state.get().get(key) == null ? defaultValue : String.valueOf(state.get().get(key));
    }

    /** 获取数字类型的值 */
    public static <T extends Number> T getNumber(String key, Class<T> targetClass) {
        return state.get().get(key) == null ? null : NumberUtils.parseNumber("" + state.get().get(key), targetClass);
    }

    /** 获取数字类型的值并指定默认值 */
    public static <T extends Number> T getNumber(String key, Class<T> targetClass, T defaultValue) {
        return state.get().get(key) == null ? defaultValue : NumberUtils.parseNumber("" + state.get().get(key), targetClass);
    }

    /**
     * 强转值类型，在已知value类型时使用，否则会报类型转换异常错误
     */
    public static <T> T getAny(String key, T defaultValue) {
        if (state.get().get(key) == null) {
            return (T) defaultValue;
        } else {
            return (T) state.get().get(key);
        }
    }

    /** 获取所有参数 */
    public static Map<String, Object> getAll() {
        return state.get();
    }

    /** 删除值 */
    public static <T> T remove(String key) {
        return (T) state.get().remove(key);
    }

    /** 清空数据 */
    public static void clear() {
        if (state.get().size() > 0) {
            // 每次用完都删除当前ThreadLocal，下次使用时重新初始化
            state.remove();
            // 每次用完只清空map，使当前ThreadLocal在所有线程间冗余
            //state.get().clear();
        }
    }

}
